import { Context, Schema, h } from 'koishi';
import { readFileSync } from 'fs';
import { resolve } from 'path';

export const inject = {
  required: ["http"]
};

const pkg = JSON.parse(
  readFileSync(resolve(__dirname, '../package.json'), 'utf-8')
);

export const name = 'roll-history-today';
export const usage = `
<h1>📚 Koishi 插件: 历史上的今天 🎲</h1>
<h2>🎯 插件版本：v${pkg.version}</h2>

<hr>

<h3>💡 使用指南</h3>
<p>
  发送 <code>历史上的今天</code> 或 <code>history today</code>，机器人会从当天的历史事件中随机选择一个并发送。
</p>
<p>
  回复内容格式为：<code>历史上的今天：(第 N 条 / 共 M 条) 标题 事件详情</code>。
</p>
<p>
  你也可以使用命令选项来指定行为：
</p>
<ul>
  <li><code>历史上的今天 -n 5</code>: 查看当天的第 5 条历史事件。</li>
  <li><code>历史上的今天 --count</code>: 只返回当天的事件总数。</li>
</ul>

<hr>

<h3>⚙️ 配置说明</h3>
<p>本插件需要配置 <a href="https://www.mxnzp.com/doc/detail?id=18">某能API</a> 的应用ID和应用密钥。</p>
<ul>
  <li><b><code>rollAppId</code></b>:
    <p>类型: <code>string</code></p>
    <p>描述: 你的 API 应用ID。</p>
  </li>
  <li><b><code>rollAppSecret</code></b>:
    <p>类型: <code>string</code></p>
    <p>描述: 你的 API 应用密钥。</p>
  </li>
  <li><b><code>sendImage</code></b>:
    <p>类型: <code>boolean</code></p>
    <p>描述: 是否在回复中包含事件相关的图片，默认为 <code>false</code>。</p>
  </li>
</ul>
`;

export interface Config {
  rollAppId: string;
  rollAppSecret: string;
  
  enableQuote: boolean;
  sendImage: boolean;
  maxMessageLength: number;
}

export const Config: Schema<Config> = Schema.intersect([
  Schema.object({
    rollAppId: Schema.string().description('应用ID').required(),
    rollAppSecret: Schema.string().description('应用密钥').required(),
  }).description('API配置，点击 "申请appid" 获取：https://www.mxnzp.com/doc/detail?id=18'),

  Schema.object({
    enableQuote: Schema.boolean().default(true).description('是否引用回复'),
    sendImage: Schema.boolean().default(false).description('是否发送图片'),
    maxMessageLength: Schema.number().default(2300).description('最大消息长度'),
  }).description("消息设置")
]);

export function apply(ctx: Context, config: Config) {
  ctx.command('历史上的今天', '获取历史上的今天')
    .alias('history today')
    .option('number', '-n <index:number> 指定要查看的事件序号')
    .option('count', '-c, --count 只返回事件总数')
    .action(async ({ session, options }) => {
      const url = 'https://www.mxnzp.com/api/history/today';

      const params = {
        type: 1,
        app_id: config.rollAppId,
        app_secret: config.rollAppSecret,
      };

      try {
        const data = await ctx.http.get(url, { params });
        if (data.code !== 1 || !data.data || data.data.length === 0) {
          return '抱歉，获取“历史上的今天”数据失败，请检查API配置或稍后再试。';
        }

        const events = data.data;
        const totalEvents = events.length;

        // 处理 --count 参数
        if (options.count) {
          return `今天一共有 ${totalEvents} 条历史事件。`;
        }
        
        let selectedEvent;
        let selectedIndex: number;

        // 处理 --number 参数
        if (options.number) {
          selectedIndex = options.number - 1; // 将用户输入的1-based索引转换为0-based
          if (selectedIndex < 0 || selectedIndex >= totalEvents) {
            return `抱歉，你指定的序号 ${options.number} 超出了范围。今天一共有 ${totalEvents} 条事件。`;
          }
          selectedEvent = events[selectedIndex];
        } else {
          // 默认行为：随机选择
          selectedIndex = Math.floor(Math.random() * totalEvents);
          selectedEvent = events[selectedIndex];
        }

        const imageUrl = selectedEvent.picUrl;
        const dateString = `${selectedEvent.year}年${selectedEvent.month}月${selectedEvent.day}日`;

        const titleMessage = `历史上的今天：\n\t ( ${selectedIndex + 1} / ${totalEvents} )`;
        const contentMessage = `\t=====${dateString}：${selectedEvent.title}=====\n\n${selectedEvent.details}`;

        let message = `${titleMessage}\n${imageUrl && config.sendImage ? h.image(imageUrl) : ''}\n${contentMessage}`;
        const textLength = titleMessage.length + contentMessage.length;
        message = textLength > config.maxMessageLength ? message.substring(0, config.maxMessageLength)+`......已省略${message.length-config.maxMessageLength}个字符` : message;
        if (config.enableQuote) message = `${h.quote(session.messageId)}${message}`;
        return message;

      } catch (error) {

        ctx.logger.error('请求历史事件API时出错:', error);
        return '抱歉，请求“历史上的今天”API失败，请稍后再试或联系管理员。';

      }
    });
}